<?php 

class CartModel extends Model {

    public $table = 't_cart';

	// 用户ID
	private $userid;
	//购物车商品信息
	private $cart = array();
	
	protected function init(){

		$this->userid   		= is_login();
		$this->getCart();
	}
	
	function getCheckedCart(){
	    
	    $cart = array();
	    foreach ($this->getCart() as $item){
	        
	        if($item['status'] == 1){
	            $cart[$item['product_id']] =  $item;
	        }
	    }
	    return $cart;
	}
	
	function getCart(){
	    if($this->cart){
	        return $this->cart;
	    }
	    
		if($this->userid){
			$field = ['product_id','id','product_name','product_thumb','num','price','create_time','status'];
			$where = ['userid'=>$this->userid];
            $this->cart = [];
            foreach($this->select($field,$where) as $tmp){
                $this->cart[$tmp['product_id']] = $tmp;
            }

            //购物车合并
			$sess_cart = session('cart');
			if(is_array($sess_cart) && $sess_cart){
			    
			    foreach ($sess_cart as $key=>$tmp){
			        if(array_key_exists($key, $this->cart)){
			            //如果已经存在相同的，则把两个数量相加
			            $this->cart[$key]['num'] += $tmp['num'];
			            $this->cart[$key]['create_time'] = $tmp['create_time'];
			            continue;
			        }else{
			            //如果没有，则合并
			            $this->cart[$key] = $tmp;
			        }
			    }
			    
    			//保存至数据库
			    if($this->cart){
			        //先删除旧的
			        $this->delete($where);
			        
			        $data = array();
			        foreach ($this->cart as $tmp){
			            if(array_key_exists('id',$tmp)){
			                unset($tmp['id']);
			            }
			            $tmp['userid'] = $this->userid;
                        $data[] = $tmp;
                    }
                    //插入新的
                    $this->insert($data);
                    //清空会话中的
			        session('cart',null);
			    }
			}
			
		}else{

			$this->cart 		= session('cart');
		}
		$this->cart = is_array($this->cart) ? $this->cart : array();

		return $this->cart;
	}
	
	/**
	 * 修改购物车中的商品数量
	 * @param int $id 商品主键
	 * @param int $num 某商品修改后的数量，即直接把某商品
	 * @return boolean
	 */
	public function modNum($id,$num=1) {

		if(!array_key_exists($id, $this->cart)){
			return false;
		}
		
		if($this->userid){
			$rs = $this->update(array('num'=>$num),array('id'=>$this->cart[$id]['id']));
			if(!$rs){
				return false;
			}
		}
		
		$this->cart[$id]['num'] = $num;

		return $this->saveCart();
	}
	
	/**
	 * 商品数量+1
	 * @param int $id
	 * @param number $num
	 * @return boolean
	 */
	public function incNum($id,$num=1) {
		//如果是已经登录的用户，直接修改数据库的数量
		if($this->userid){
			$data    = array('num'=>$this->cart[$id]['num']+$num);
			$where = array('id'=>$this->cart[$id]['id']);
			$rs      = $this->update($data,$where);
			if(!$rs){
			    return false;
			}
		}
		
		//否则直接修改session中的数量
		$this->cart[$id]['num'] += $num;
		return $this->saveCart();
	}
	
	/**
	 *  商品数量-1
	 * @param $int $id
	 * @param number $num
	 */
	public function decNum($id,$num=1) {
		if(!array_key_exists($id, $this->cart)){
			return false;
		}
		
		//如果商品数量为1，则不允许再扣减
		if ($this->cart[$id]['num'] < 2) {
			return false;
		}

		
		$item = $this->cart[$id];
		//如果为已经登录，并且数量大于1，则对数据库中的数量进行修改
		if($this->userid && $item['num'] > 0){
			$rs = $this->update(array('num'=>$item['num']-1),array('id'=>$item['id']));
			//如果修改失败，返回false
			if(!$rs){
				return false;
			}
		}
		
		$this->cart[$id]['num'] -= $num;
		return $this->saveCart();
	}
	
	/**
	 * 删除商品
	 * @param int $id
	 */
	public function delItem($id) {
		if(!array_key_exists($id, $this->cart)){
			return false;
		}
		//如果是已经登录的状态，则直接删除数据库的数据
		if($this->userid){
			$rs = $this->delete(array('id'=>$this->cart[$id]['id']));
			if(!$rs){
			    return false;
			}
		}
		unset($this->cart[$id]);
		return $this->saveCart();
	}
	 
	/**
	 * 获取单个商品
	 * @param $int $id
	 */
	public function getItem($id) {
		return array_key_exists($id, $this->cart) ? $this->cart[$id] : array();
	}
	
	/**
	 * 查询购物车中商品的种数
	 * @return number
	 */
	public function getCnt() {
		return count($this->cart);
	}
	 
	/**
	 * 查询购物车中商品的个数
	 * @return number|Ambigous <number, unknown>
	 */
	public function getNum(){
		if ($this->getCnt() == 0) {
			//种数为0，个数也为0
			return 0;
		}
	
		$sum = 0;
		foreach ($this->cart as $item) {
			$sum += $item['num'];
		}
		return $sum;
	}
	
	/**
	 * 购物车中商品的总金额
	 * @return number|string
	 */
	public function getTotalPrice() {
		//数量为0，价钱为0
		if ($this->getCnt() == 0) {
			return 0;
		}
		$price = 0;
		foreach ($this->cart as $item) {
		    if($item['status']){
    			$price += $item['num'] * $item['price'];
		    }
		}
		return intval($price);
	}
	
	/**
	 * 修改状态
	 * @param int $id
	 * @param int $status
	 * @return boolean
	 */
	function changeStatus($ids,$status){

	    $in_ids = array();
	    foreach ($ids as $id){
	        
    	    if(!array_key_exists($id, $this->cart)){
    	        continue;
    	    }
    	    
    	    $this->cart[$id]['status'] = $status;
    	    $in_ids[] = $this->cart[$id]['id'];
	    }
	    
	    if($this->userid){
	        
	        $rs = $this->update(array('status'=>$status),array('id'=>array('in',$in_ids)));
	        if(!$rs){
	            return false;
	        }
	    }
	    return $this->saveCart();
	}
	
	/**
	 * 清空购物车
	 */
	public function clear() {
        $this->cart = array();
		if($this->userid){
			return $this->delete(array('userid'=>$this->userid));
		}
		return session('cart',null);
	}
	/**
	 * 添加商品到购物车
	 * @param array $product  需要加入购物车的产品
	 * @return int
	 */
	function addToCart($item=null,$num=1) {
		if (empty($item)) {
			return false;
		}
        
// 		var_dump($this->cart);die;
		//如果已经存在 ，则直接加数量
		if (array_key_exists($item['id'], $this->cart)) {
			return $this->incNum($item['id'],$num);
		}
		
		$data = array(
					'product_id'	=>$item['id'],
					'product_name'	=>$item['title'],
					'product_thumb'	=>show_pic($item['pic_url'], '160x160'),
					'price'			=>$item['price'],
					'num'			=>$num,
					'create_time'   =>time_format(),
					'status'	    =>1,
					);
		
		$this->cart[$item['id']] = $data;
		//判断用户是否已经登录
		if(empty($this->userid)){
			$this->saveCart();
			return true;
		}

		$data['userid'] 	    = $this->userid;
		$data['create_time'] 	= time_format();
		return $this->insert($data);
	}//end add
	
	/**
	 * 保存购物车
	 * @return Ambigous <boolean, string, unknown>|boolean
	 */
	public function saveCart(){
	    
		if($this->userid){
			return true;
		}
		session('cart',$this->cart);
		return true;
	}
}
